package br.com.framework.persistencia.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Superclasse  {@link MappedSuperclass} que server de base para todas as entidades
 * que necessitam suportar exclusão lógica.
 * 
 * @author Cleber
 *
 */
@MappedSuperclass
public abstract class AuditedEntity extends BaseEntity {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1954018514051702076L;
	
	/**
	 * Enum que classifica se o registro foi removido
	 * @author Cleber
	 *
	 */
	public enum RemovidoLogicamente {
		
        SIM(1), NAO(0);

        private int value;

        RemovidoLogicamente(int value) { this.value = value; }    

        public int getValue() { return value; }

        public static RemovidoLogicamente parse(int id) {
        	RemovidoLogicamente rl = null;
            for (RemovidoLogicamente item : RemovidoLogicamente.values()) {
                if (item.getValue() == id) {
                    rl = item;
                    break;
                }
            }
            return rl;
        }

    };

	private Date dataCriacao;
	private Date dataModificacao;
	
	private int removido = RemovidoLogicamente.NAO.value;

	@Column(name = "DATA_CRIACAO", nullable = false)
	@Temporal(TemporalType.TIMESTAMP)
	public Date getDataCriacao() {
		return dataCriacao;
	}

	/**
	 * @return the removido
	 */
	@Column(name = "REMOVIDO", nullable = false)
	public RemovidoLogicamente getRemovido() {
		return RemovidoLogicamente.parse(removido);
	}

	/**
	 * @param removido the removido to set
	 */
	public void setRemovido(RemovidoLogicamente removido) {
		this.removido = removido.getValue();
	}
	
	/**
	 * @param dataCriacao the dataCriacao to set
	 */
	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	/**
	 * @param dataModificacao the dataModificacao to set
	 */
	public void setDataModificacao(Date dataModificacao) {
		this.dataModificacao = dataModificacao;
	}

	@Column(name = "DATA_MODIFICACAO", nullable = false)
	@Temporal(TemporalType.TIMESTAMP)
	public Date getDataModificacao() {
		return dataModificacao;
	}

	@PrePersist
	public void initTimeStamps() {
		// we do this for the purpose of the demo, this lets us create our own
		// creation dates. Typically we would just set the createdOn field.
		if (dataCriacao == null) {
			dataCriacao = new Date();
		}
		dataModificacao = dataCriacao;
	}

	@PreUpdate
	public void updateTimeStamp() {
		dataModificacao = new Date();
	}

}
